﻿using System.Collections.Generic;
using PES.Common.DAL;

namespace PES.Common.BLL
{
    using Model;

    public class EstatisticasBLL
    {
        private static JogadorVirtualDAL s_jogVirtualDAL;
        private static JogadorVirtualDAL JogVirtualDAL
        {
            get { return s_jogVirtualDAL ?? (s_jogVirtualDAL = new JogadorVirtualDAL()); }
        }

        private static PartidaDAL s_partidaDAL;
        private static PartidaDAL PartidaDAL
        {
            get { return s_partidaDAL ?? (s_partidaDAL = new PartidaDAL()); }
        }

        public static List<JogadorVirtual> BuscarArtilheiros(Campeonato _camp)
        {
            return JogVirtualDAL.BuscarJogadoresVirtuaisOrdenadosPorTotalGols(_camp.ID);
        }

        public static List<JogadorVirtual> BuscarIndiciplinados(Campeonato _camp)
        {
            return JogVirtualDAL.BuscarJogadoresVirtuaisOrdenadosPorCartoes(_camp.ID);
        }

        public static EstatisticasCampeonato BuscarEstatisticasCampeonato(Campeonato _campeonato)
        {
            var estatisticas = new EstatisticasCampeonato();

            var partidas = PartidaDAL.BuscarTodasPartidas(_campeonato.ID);
            estatisticas.TotalPartidasDisputadas = 0;
            estatisticas.TotalPartidasRestantes = 0;
            var placaresFrequentes = new Dictionary<string, int>();
            foreach (var partida in partidas)
            {
                if (partida.PlacarRegistrado)
                {
                    estatisticas.TotalPartidasDisputadas++;
                    //Total de gols marcados
                    estatisticas.TotalGols += partida.GolsJogador1.Value + partida.GolsJogador2.Value;

                    //Media de gols
                    estatisticas.MediaDeGols = ((double)estatisticas.TotalGols) / estatisticas.TotalPartidasDisputadas;

                    //Placares frequentes
                    string placarEmString = partida.GolsJogador1.Value + ";" + partida.GolsJogador2.Value;
                    if (!placaresFrequentes.ContainsKey(placarEmString))
                    {
                        placaresFrequentes.Add(placarEmString, 0);
                    }
                    placaresFrequentes[placarEmString]++;
                }
                else
                {
                    estatisticas.TotalPartidasRestantes++;
                }
            }

            estatisticas.PlacaresMaisFrequentes = new List<PlacarFrequente>(3);

            //Exibe placares frequentes somente após a 3a. partida.
            if (placaresFrequentes.Count > 2)
            {
                var placaresFrequentesValores = new int[3];
                var placaresFrequentesStrings = new string[3];

                foreach (var entrada in placaresFrequentes)
                {
                    if (entrada.Value > placaresFrequentesValores[0])
                    {
                        placaresFrequentesValores[0] = entrada.Value;
                        placaresFrequentesStrings[0] = entrada.Key;
                    }
                    else if (entrada.Value > placaresFrequentesValores[1])
                    {
                        placaresFrequentesValores[1] = entrada.Value;
                        placaresFrequentesStrings[1] = entrada.Key;
                    }
                    else if (entrada.Value > placaresFrequentesValores[2])
                    {
                        placaresFrequentesValores[2] = entrada.Value;
                        placaresFrequentesStrings[2] = entrada.Key;
                    }
                }
               
                if (!string.IsNullOrEmpty(placaresFrequentesStrings[0]))
                {
                    var p1 = new PlacarFrequente
                                             {
                                                 GolsJogador1 = int.Parse(placaresFrequentesStrings[0].Split(';')[0]),
                                                 GolsJogador2 = int.Parse(placaresFrequentesStrings[0].Split(';')[1]),
                                                 QtdeVezes = placaresFrequentesValores[0]
                                             };

                    estatisticas.PlacaresMaisFrequentes.Add(p1);
                }

                if (!string.IsNullOrEmpty(placaresFrequentesStrings[1]))
                {
                    var p2 = new PlacarFrequente
                                 {
                                     GolsJogador1 = int.Parse(placaresFrequentesStrings[1].Split(';')[0]),
                                     GolsJogador2 = int.Parse(placaresFrequentesStrings[1].Split(';')[1]),
                                     QtdeVezes = placaresFrequentesValores[1]
                                 };

                    estatisticas.PlacaresMaisFrequentes.Add(p2);
                }

                if (!string.IsNullOrEmpty(placaresFrequentesStrings[2]))
                {
                    var p3 = new PlacarFrequente
                                 {
                                     GolsJogador1 = int.Parse(placaresFrequentesStrings[2].Split(';')[0]),
                                     GolsJogador2 = int.Parse(placaresFrequentesStrings[2].Split(';')[1]),
                                     QtdeVezes = placaresFrequentesValores[2]
                                 };

                    estatisticas.PlacaresMaisFrequentes.Add(p3);
                }
            }

            return estatisticas;
        }
    }
}
